#!/usr/bin/perl
#si pas le même redpertoire mettre -I a l'appelle de perl suivi du repertoire avec les packages
use strict;
use warnings;
use p_files_with_eval_manager;
use p_index_manager;
use constant NB_CLASSE => 4;
use constant NB_CLASSE_H => 6;


sub where_is_the_max{
	if(!exists($_[0][0])){
		return -1;
	}
	my $cpt=0;
	my $max=0;
	while(exists($_[0][$cpt])){
		#print"$_[0][$cpt],\t";
		if($_[0][$cpt]>$_[0][$max]){
			$max=$cpt;
		}
		$cpt++;
	}
	#print"max:$max\n";
	return $max;
}

my $renewIndex = 0;
my $renewEval = 0;
if(exists($ARGV[0])){
	my $cpt=0;
	while(exists($ARGV[$cpt])){
		if($ARGV[$cpt] eq "--renewIndex"){
			$renewIndex=1;
			$ARGV[$cpt]="";
		}elsif($ARGV[$cpt] eq "--renewEval"){
			$renewEval=1;
			$ARGV[$cpt]="";
		}
		$cpt++;
	}
}

if(!exists($ARGV[0])){
	die("Mauvaise utilisation de 3.2-classifieur_hierarchique.perl, vous devez spécifier le corpus de travail\n");
}
my $nbPartition;
if(!exists($ARGV[1])||$ARGV[1] eq ""){
	print "Nombre de partition mise par défaut à\t10\n";
	$nbPartition=10;
}elsif($ARGV[1]!~/^[0-9]+$/){
	print "Nombre de partition \"$ARGV[1]\" incorrect, quatité mise par défaut à\t10\n";
	$nbPartition=10;
}else{
	print "Nombre de partition mise à\t$ARGV[1]\n";
	$nbPartition=$ARGV[1];
}

print "chargement de l'index\n";
my %index = %{&p_index_manager::get_index($ARGV[0],$renewIndex)};

print "chargement des evals\n";
my %filesWithEval = %{&p_files_with_eval_manager::getFilesWithEval($ARGV[0],$nbPartition,$renewEval)};
#le format de %filesWithEval est un hash de tableau où une ligne :  note{-1..3} determinée?{0..1} nbPartition{0..($nbPartition-1)}

my $sommeTaux=0;
my $sommeSscore=0;
my $temps=time();
print "Evaluation\n";
for my $paritionPourEvalutation (0..($nbPartition-1)){
	#print "Evaluation sur\t$paritionPourEvalutation\n";
	#Apprentissage
	my %proba=();
	my @qteByClasse=();
	#my $sizeVocabulaire=keys(%index);
	for (my $k=0;$k<NB_CLASSE_H;$k++){
		$qteByClasse[$k]=0;
	}
	for my $klemme( keys(%index)){
		my %hDoc = %{$index{$klemme}};
		$proba{$klemme}=[1];
		for my $k (0..NB_CLASSE_H-1){
			$proba{$klemme}[$k]=1.1;
		}
		#my $totalMots=4;
		for my $kdoc (keys(%hDoc)){
			#si c'est pas un document dans celui utilisé pour le test, et qu'il a une note
			if($filesWithEval{$kdoc}[2]!=$paritionPourEvalutation && $filesWithEval{$kdoc}[0]!=-1){
				#on addition à la classe du document pour le klemme le nombre de fois qu'il est dans le document
				$proba{$klemme}[$filesWithEval{$kdoc}[0]]+=$hDoc{$kdoc};
				#on addition à la surclasse cette même valeur, les surclasses sont en faite 0,1 étoile et 2,3 étoiles
				$proba{$klemme}[NB_CLASSE+$filesWithEval{$kdoc}[0]/2]+=$hDoc{$kdoc};
			}
		}
	}
	#normalisation
	for my $klemme(keys(%proba)){
		for my $k (0..NB_CLASSE_H-1){
			$qteByClasse[$k]+=$proba{$klemme}[$k];
		}
	}
	for my $klemme(keys(%proba)){
		for my $k (0..NB_CLASSE_H-1){
			#print"$proba{$klemme}[$k]\t";
			$proba{$klemme}[$k]/=$qteByClasse[$k];
		}
		#print"\t$klemme\n";
	}

	#Evaluation des résultats
	my $Sscore=0;
	my $nbEssai=0;
	my $nbReussite=0;
	my %probaDoc=();
	for my $klemme( keys(%index)){
		my %hDoc = %{$index{$klemme}};
		for my $kdoc (keys(%hDoc)){
			#si c'est un document utilisé pour le test
			if($filesWithEval{$kdoc}[2]==$paritionPourEvalutation){
				if(!exists($probaDoc{$kdoc})){
					for my $k (0..NB_CLASSE_H-1){
						$probaDoc{$kdoc}[$k]=0;#0;
					}
				}
				for my $k (0..NB_CLASSE_H-1){
					$probaDoc{$kdoc}[$k]+=log($proba{$klemme}[$k]);
				}
			}
		}
	}

	$nbEssai=keys(%probaDoc);
	my $numOfTheMax;
	for my $kdoc( keys(%probaDoc)){
		if($probaDoc{$kdoc}[4]>$probaDoc{$kdoc}[5]){
			#0 et 1 étoile
			if($probaDoc{$kdoc}[0]>$probaDoc{$kdoc}[1]){
				if($filesWithEval{$kdoc}[0]==0){
          #réussite
					$nbReussite++;
					$Sscore+=1;
				}else{
          #echec
					$Sscore+=exp(-abs($filesWithEval{$kdoc}[0]-0));
				}
			}else{
				if($filesWithEval{$kdoc}[0]==1){
          #réussite
					$nbReussite++;
					$Sscore+=1;
				}else{
          #echec
					$Sscore+=exp(-abs($filesWithEval{$kdoc}[0]-1));
				}
			}
		}else{
			#2 et 3 étoile
			if($probaDoc{$kdoc}[2]>$probaDoc{$kdoc}[3]){
          #réussite
				if($filesWithEval{$kdoc}[0]==2){
					$nbReussite++;
					$Sscore+=1;
				}else{
          #echec
					$Sscore+=exp(-abs($filesWithEval{$kdoc}[0]-2));
				}
			}else{
				if($filesWithEval{$kdoc}[0]==3){
          #réussite
					$nbReussite++;
					$Sscore+=1;
				}else{
          #echec
					$Sscore+=exp(-abs($filesWithEval{$kdoc}[0]-3));
				}
			}
		}
	}
	
	$Sscore/=$nbEssai;
#	print "Taux de réussite : $nbReussite/$nbEssai soit\t" . int($nbReussite/$nbEssai*100) . "% avec un Sscore de " . int(100*$Sscore)/100 ."\n";
	$sommeTaux+=$nbReussite/$nbEssai*100;
	$sommeSscore+=$Sscore;
}
print "Taux de réussite moyen :\t" . int(1000*$sommeTaux/$nbPartition)/1000 . "%\n";
print "Sscore moyen :\t\t\t" . int(1000*$sommeSscore/$nbPartition)/1000 . "\n";
print "Durée :\t\t\t\t" . (time()-$temps) . " secondes\n";










